package com.boot5.mapper;

import com.boot5.pojo.Emp;
import org.apache.ibatis.annotations.*;

import java.time.LocalDate;
import java.util.List;
import java.util.Properties;

/**
 * @author wzm
 * @create 2024-03-01 9:41
 * project_name:JavaWeb2401
 * @Description
 */
@Mapper
public interface EmpMapper {
    //定义根据id删除员工的方法 参数#{参数名}
    @Delete("delete from emp where id = #{id}")
    int delete(Integer id);

    //定义新增员工的方法
    //默认情况下 主键是不会返回的 但是 如果在功能中需要回去新增或的主键值 可以使用注解@Options useGeneratedKeys 使用生成键
    //keyProperty 主键的主机赋值给哪个属性
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into emp(username,name,gender,image,job,entrydate,dept_id,create_time,update_time) " +
            "values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    int insert(Emp emp);

    //修改的方法
    @Update("update emp set username = #{username},name=#{name},gender=#{gender},image=#{image},job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime} where id = #{id}")
    void update(Emp emp);

    //根据id查询
    /*
    * mybatis默认查询是会将数据库类名与实体属性名一致的数据进行封装 不一致则不能封装
    * 解决：
    * 别名 dept_id deptId
    * 手动映射 指定哪个列的值赋值哪个属性 @Results({@Result(column ="数据库列",property="实体属性")})
    * 开启驼峰命名配置 如果字段名和实体属性名符合驼峰负责则会自动映射
    *    规则： abc_xyz===>abcXyz
    *   表中：abc_xyz  实体中：abcXyz
    * */
 /*   @Results({
            @Result(column = "dept_id",property = "deptId"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "create_time",property = "updateTime")
    })*/
    @Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time " +
            "from emp where id = #{id}")
    Emp select(Integer id);


    //条件查询
    //@Param("sex") springboot1.x版本的时候要求参数必须使用该注解指定名字 才能在@select上使用 2.x版本只需要保证形参与使用变量名一致即可
    @Select("select * from emp " +
            "where name like concat('%',#{name},'%')  and gender = #{sex} " +
            "and entrydate between #{begin} and #{end} " +
            "order by update_time desc")
    List<Emp> selectByIf(String name,@Param("sex") Short gender, LocalDate begin,LocalDate end);



}



/*
* 参数占位符：#{}  ${}
* #{}：
*  执行sql先将sql的#{...}替换为？，生成预编译的sql,自动设置参数值 所有的内容只是参数
*  使用时机：参数传递
* ${}:
*   直接拼接sql,将参数直接拼接在sql语句中 存在特殊值的sql注入问题
*   使用时机：表名 列名动态设置使用
* */


